package Logica;

import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JPanel;

import Celdas.NoTransitable;
import Celdas.Transitable;
import Excepciones.BoundaryViolationException;
import Excepciones.InvalidPositionException;
import Robot.Robot;
import TDALista.Position;

public class Mapa extends JPanel implements Runnable{
	
	protected int ancho, alto;
	protected Juego juego;
	protected boolean pausado;
	
	public Mapa(Juego j){
		pausado = false;
		juego = j;
		ancho = juego.getAnchoMapa();
		alto = juego.getAltoMapa();
		System.out.println("Ancho mapa: "+ancho + "   Alto mapa   " + alto);
		
	}
	
	public void paint(Graphics g){
		
        super.paint(g);
        int posX = 0, posY = 0;
        Graphics2D g2d = (Graphics2D)g;
        Position<Transitable> aux = juego.getTransitables().first();
        Position<NoTransitable> auxN = juego.getNoTransitables().first();
        Position<Proyectil> proyectil = juego.getProyectiles().first();

        
        
        try {
                while (aux != juego.getTransitables().last()){
                    
                    posX = aux.element().getX();// * aux.element().getGrafica().getWidth();
                    posY = aux.element().getY();// * aux.element().getGrafica().getHeight();
                   // g2d.drawImage(aux.element().getGrafica().ObtenerImagen(), posX, posY, null);
                    aux.element().getGrafica().draw(g2d, posX, posY, 0);
					
                    if ( aux.element().hayColeccionable() )
                       // g2d.drawImage(aux.element().getColeccionable().getGrafica().ObtenerImagen(), posX, posY, null);
                    	aux.element().getColeccionable().getGrafica().draw(g2d, posX, posY, 0);
                    
                    if ( aux.element().hayObjeto() && aux.element().getObjeto().getIndice() > 0 )
                    	//g2d.drawImage(aux.element().getObjeto().getGrafica().ObtenerImagen(), posX, posY, null);
                    	aux.element().getObjeto().getGrafica().draw(g2d, posX, posY, 0);
                    
                    
                    if ( aux.element().hayPremio() )
                    	//g2d.drawImage(aux.element().getPremio().getGrafica().ObtenerImagen(), posX, posY, null);
                    	aux.element().getPremio().getGrafica().draw(g2d, posX, posY, 0);
                    
                    aux = juego.getTransitables().next(aux);
					
                }
                if (aux == juego.getTransitables().last()){
                	posX = aux.element().getX();
                    posY = aux.element().getY();
                    //g2d.drawImage(aux.element().getGrafica().ObtenerImagen(), posX, posY, null);
                    aux.element().getGrafica().draw(g2d, posX, posY, 0);
                    
					
                }
                
                while (auxN != juego.getNoTransitables().last()){
                	posX = auxN.element().getX();
                    posY = auxN.element().getY();
                    //g2d.drawImage(auxN.element().getGrafica().ObtenerImagen(), posX, posY, null);
                    auxN.element().getGrafica().draw(g2d, posX, posY, 0);
					auxN = juego.getNoTransitables().next(auxN);
					
                }
                
                if (!juego.getNoTransitables().isEmpty() && auxN == juego.getNoTransitables().last()){
                	posX = auxN.element().getX();
                    posY = auxN.element().getY();
                    //g2d.drawImage(auxN.element().getGrafica().ObtenerImagen(), posX, posY, null);
                    auxN.element().getGrafica().draw(g2d, posX, posY, 0);
                    
					
                }
                
                if (!juego.getProyectiles().isEmpty()){
	                while ( proyectil != juego.getProyectiles().last()){
	                	if (!proyectil.element().getStatus())
	                		juego.getProyectiles().remove(proyectil);
	                	
	                	proyectil.element().draw(g2d);
						
						if ((proyectil.element().GetX() > ancho) || (proyectil.element().GetX() < -100) || (proyectil.element().GetY() > alto) || (proyectil.element().GetY() < -100)){
							proyectil.element().impactar();
							juego.getProyectiles().remove(proyectil);
						}
						
						proyectil = juego.getProyectiles().next(proyectil);
						
						
	                }
	                
	                if (!juego.getProyectiles().isEmpty() && proyectil == juego.getProyectiles().last()){
	                	if (!proyectil.element().getStatus())
	                		juego.getProyectiles().remove(proyectil);
	                	
	                	proyectil.element().draw(g2d);
	                    
	                    if ((proyectil.element().GetX() > ancho) || (proyectil.element().GetX() < -100 ) || (proyectil.element().GetY() > alto) || (proyectil.element().GetY() < -100)){
							proyectil.element().impactar();
							juego.getProyectiles().remove(proyectil);
						}
	                }
                }
        
        } catch (InvalidPositionException
				| BoundaryViolationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        juego.paint(g2d);
       
        //System.out.println("Repintando");
        
	}
	
	/**
	 * retorna el juego
	 * @return
	 */
	public Juego getJuego(){
		return juego;
	}
	
	/**
	 * Metodo para seteal el ancho del mapa
	 * @param a
	 */
	public void setAncho (int a){
		ancho = a;
	}
	
	/**
	 * metodo para setear el ancho del mapa
	 * @param a
	 */
	public void setAlto (int a){
		alto = a;
	}
	
	/**
	 * Retorna el ancho
	 * @return
	 */
	public int getAncho (){
		return ancho;
	}
	
	/**
	 * Retorna el alto
	 * @return
	 */
	public int getAlto (){
		return alto;
	}
	
	/**
	 * Setea el juego
	 * @return
	 */
	public void setJuego(Juego j){
		juego = j;
		ancho = juego.getAnchoMapa();
		alto = juego.getAltoMapa();
	}
	
	/**
	 * pausa el juego
	 */
	public synchronized void pausar(){
		pausado = true;
		notify();
	}
	
	/**
	 * reanuda el juego
	 */
	public synchronized void reanudar(){
		pausado = false;
		notify();
	}
	
	
	/**
	 * Ejecuta el hilo del mapa
	 */
	@Override
	public void run() {

		if (!pausado){
			while (true){
				this.repaint();
				try {
					Thread.sleep(20);
					
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}else{
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		
	}
	
	

	
	
	
	
}
